package com.mastercard.assets.web.util.reportes;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.reporteForm;
import com.mastercard.assets.web.util.to.utilReporteDos;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

public class reporteTwo {

    public static List< datosReporteDos > generaReporte( reporteForm f ) throws MasterCardException {
        
        List< datosReporteDos > res = new ArrayList< datosReporteDos >( ) ;

        String sql = "Select p.nombre, tcu.nombre, cu.nombre, c.fecha_ini, c.fecha_fin, c." + f.getResultado() + " "
                + "from "
                + "tbl_paises p join tbl_usuario us join tbl_campania c join tbl_cuenta cu join tbl_tipo_cuenta tcu "
                + "where "
                + "c.cve_cuenta = cu.cve_cuenta and cu.cve_tipo_cuenta = tcu.cve_tipo_cuenta "
                + "and us.cve_usuario = c.cve_usuario_resp and p.cve_pais = us.cve_pais and c.`status`= 1 and c.bandera=1"
                + "";
        if (f.getPaisR2() != 0) {

            sql = sql + " and p.cve_pais = " + f.getPaisR2( ) ;

        }

        if (f.getTipoCuenta() != 0) {

            sql = sql + " and tcu.cve_tipo_cuenta= " + f.getTipoCuenta( ) ;

        }

        if (f.getAnio() != 0) {

            String ini = f.getAnio() + "-01-01",
                    fin = f.getAnio() + "-12-31";

            sql = sql + " and (c.fecha_ini between '" + ini + "' and '" + fin + "' or "
                    + "c.fecha_fin between '" + ini + "' and '" + fin + "')";

        }
        List< utilReporteDos > uRD = MasterCardDAO.datosReporteDos( sql ) ;
        
        if( f.getPeriodo( ).equals( "Total" ) ){
            try{
                
                for( utilReporteDos l : uRD ){// INI barre lista que mando el query
                    
                    boolean esta = false ;
                    datosReporteDos dR2 = new datosReporteDos(  ) ;
                    
                    if( !res.isEmpty( ) ){
                        
                        for( datosReporteDos lRes : res ){// INI barre la lista a regresar
                            
                            if( lRes.getPais( ).equals( l.getPais( ) ) && lRes.getCuenta( ).equals( l.getCuenta( ) ) ){
                                // SI FUE AGREGADO ANTERIORMENTE LO SUMA    
                                BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;                        
                                BigDecimal[ ] qs = sumaQ( meses ) ;
                                
                                lRes.setTotal( lRes.getTotal( ).add( qs[ 4 ] ) ) ;
                                
                                esta = true ;
                                break ;
                                
                            }
                            
                        }// FIN barre la lista a regresar
                        
                    }else{
                        // SI EL ARREGLO A REGRESAR ESTA VACIO LO AGREGA                        
                        BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;                        
                        BigDecimal[ ] qs = sumaQ( meses ) ;
                        
                        dR2.setPais( l.getPais( ) ) ;
                        dR2.setCuenta( l.getCuenta( ) ) ;
                        dR2.setTipoCuenta( l.getTipoCuenta( ) ) ;
                        dR2.setTotal( qs[ 4 ] ) ;
                        
                        res.add( dR2 ) ;
                        
                        esta = true ;                        
                    }
                    
                    if( !esta ){
                        
                        // SI NO LO ENCUENTRA, LO AREGA
                        BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;                        
                        BigDecimal[ ] qs = sumaQ( meses ) ;
                        
                        dR2.setPais( l.getPais( ) ) ;
                        dR2.setCuenta( l.getCuenta( ) ) ;
                        dR2.setTipoCuenta( l.getTipoCuenta( ) ) ;
                        dR2.setTotal( qs[ 4 ] ) ;
                                
                        res.add( dR2 ) ;
                        
                    }
                    
                }// FIN barre lista que mando el query
                
            }catch( Exception e ){
                e.printStackTrace( ) ;
            }
            
        }else
            if( f.getPeriodo( ).equals( "Por Cuarto" ) ){
                
                try{
                
                for( utilReporteDos l : uRD ){// INI barre lista que mando el query
                    
                    boolean esta = false ;
                    datosReporteDos dR2 = new datosReporteDos(  ) ;
                    
                    if( !res.isEmpty( ) ){
                        
                        for( datosReporteDos lRes : res ){// INI barre la lista a regresar
                            
                            if( lRes.getPais( ).equals( l.getPais( ) ) && lRes.getCuenta( ).equals( l.getCuenta( ) ) ){
                                
                                // SI FUE AGREGADO ANTERIORMENTE LO SUMA
                                BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;
                                BigDecimal[ ] qs = sumaQ( meses ) ;
                                
                                lRes.setQ1( lRes.getQ1( ).add( qs[ 0 ] ) ) ;
                                lRes.setQ2( lRes.getQ2( ).add( qs[ 1 ] ) ) ;
                                lRes.setQ3( lRes.getQ3( ).add( qs[ 2 ] ) ) ;
                                lRes.setQ4( lRes.getQ4( ).add( qs[ 3 ] ) ) ;
                                lRes.setTotal( lRes.getTotal( ).add( qs[ 4 ] ) ) ;
                                                                
                                esta = true ;
                                break ;
                                
                            }
                            
                        }// FIN barre la lista a regresar
                        
                    }else{
                                                
                        // SI EL ARREGLO A REGRESAR ESTA VACIO LO AGREGA
                        dR2 = new datosReporteDos(  ) ;
                        
                        BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;
                        
                        BigDecimal[ ] qs = sumaQ( meses ) ;
                        
                        dR2.setPais( l.getPais( ) ) ;
                        dR2.setCuenta( l.getCuenta( ) ) ;
                        dR2.setTipoCuenta( l.getTipoCuenta( ) ) ;
                        dR2.setQ1( qs[ 0 ] ) ;
                        dR2.setQ2( qs[ 1 ] ) ;
                        dR2.setQ3( qs[ 2 ] ) ;
                        dR2.setQ4( qs[ 3 ] ) ;
                        dR2.setTotal( qs[ 4 ] ) ;
                        
                        res.add( dR2 ) ;
                        esta = true ;
                    }
                    
                    if( !esta ){
                        
                        // SI NO LO ENCUENTRA, LO AREGA
                        BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;
                        BigDecimal[ ] qs = sumaQ( meses ) ;
                        
                        dR2.setPais( l.getPais( ) ) ;
                        dR2.setCuenta( l.getCuenta( ) ) ;
                        dR2.setTipoCuenta( l.getTipoCuenta( ) ) ;
                        dR2.setQ1( qs[ 0 ] ) ;
                        dR2.setQ2( qs[ 1 ] ) ;
                        dR2.setQ3( qs[ 2 ] ) ;
                        dR2.setQ4( qs[ 3 ] ) ;
                        dR2.setTotal( qs[ 4 ] ) ;
                            
                        res.add( dR2 ) ;
                            
                    }
                    
                }// FIN barre lista que mando el query
                
                }catch( Exception e ){
                    e.printStackTrace( ) ;
                }
            }else if( f.getPeriodo( ).equals( "Por Mes" ) ){
                
                try{
                    BigDecimal cero = new BigDecimal( 0 ) ;
                for( utilReporteDos l : uRD ){// INI barre lista que mando el query
                    
                    boolean esta = false ;
                    datosReporteDos dR2 = new datosReporteDos(  ) ;
                    
                    if( !res.isEmpty( ) ){
                        
                        for( datosReporteDos lRes : res ){// INI barre la lista a regresar
                            
                            if( lRes.getPais( ).equals( l.getPais( ) ) && lRes.getCuenta( ).equals( l.getCuenta( ) ) ){
                                
                                // SI FUE AGREGADO ANTERIORMENTE LO SUMA
                                BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;
                                BigDecimal[ ] qs = sumaQ( meses ) ;
                                
                                lRes.setEnero( lRes.getEnero( ).add( ( meses[ 0 ] == null ) ? cero : meses[ 0 ]  ).setScale( 4 ) ) ;
                                lRes.setFebrero( lRes.getFebrero( ).add( ( meses[ 1 ] == null ) ? cero : meses[ 1 ] ).setScale( 4 ) ) ;
                                lRes.setMarzo( lRes.getMarzo( ).add( ( meses[ 2 ] == null ) ? cero : meses[ 2 ] ).setScale( 4 ) ) ;
                                lRes.setAbril( lRes.getAbril( ).add( ( meses[ 3 ] == null ) ? cero : meses[ 3 ] ).setScale( 4 ) ) ;
                                lRes.setMayo( lRes.getMayo( ).add( ( meses[ 4 ] == null ) ? cero : meses[ 4 ] ).setScale( 4 ) ) ;
                                lRes.setJunio( lRes.getJunio( ).add( ( meses[ 5 ] == null ) ? cero : meses[ 5 ] ).setScale( 4 ) ) ;
                                lRes.setJulio( lRes.getJulio( ).add( ( meses[ 6 ] == null ) ? cero : meses[ 6 ] ).setScale( 4 ) ) ;
                                lRes.setAgosto( lRes.getAgosto( ).add( ( meses[ 7 ] == null ) ? cero : meses[ 7 ] ).setScale( 4 ) ) ;
                                lRes.setSeptiembre( lRes.getSeptiembre( ).add( ( meses[ 8 ] == null ) ? cero : meses[ 8 ] ).setScale( 4 ) ) ;
                                lRes.setOctubre( lRes.getOctubre( ).add( ( meses[ 9 ] == null ) ? cero : meses[ 9 ] ).setScale( 4 ) ) ;
                                lRes.setNoviembre( lRes.getNoviembre( ).add( ( meses[ 10 ] == null ) ? cero : meses[ 10 ] ).setScale( 4 ) ) ;
                                lRes.setDicienmre( lRes.getDicienmre( ).add( ( meses[ 11 ] == null ) ? cero : meses[ 11 ] ).setScale( 4 ) ) ;
                                lRes.setTotal( lRes.getTotal( ).add( qs[ 4 ] ).setScale( 4 ) ) ;
                                                                
                                esta = true ;
                                break ;
                                
                            }
                            
                        }// FIN barre la lista a regresar
                        
                    }else{
                                                
                        // SI EL ARREGLO A REGRESAR ESTA VACIO LO AGREGA
                        dR2 = new datosReporteDos(  ) ;
                        
                        BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;
                        
                        BigDecimal[ ] qs = sumaQ( meses ) ;
                        
                        dR2.setPais( l.getPais( ) ) ;
                        dR2.setCuenta( l.getCuenta( ) ) ;
                        dR2.setTipoCuenta( l.getTipoCuenta( ) ) ;
                        dR2.setEnero( ( meses[ 0 ] == null ) ? cero : meses[ 0 ].setScale( 4 ) ) ;
                        dR2.setFebrero( ( meses[ 1 ] == null ) ? cero : meses[ 1 ].setScale( 4 ) ) ;
                        dR2.setMarzo( ( meses[ 2 ] == null ) ? cero : meses[ 2 ].setScale( 4 ) ) ;
                        dR2.setAbril( ( meses[ 3 ] == null ) ? cero : meses[ 3 ].setScale( 4 ) ) ;
                        dR2.setMayo( ( meses[ 4 ] == null ) ? cero : meses[ 4 ].setScale( 4 ) ) ;
                        dR2.setJunio( ( meses[ 5 ] == null ) ? cero : meses[ 5 ].setScale( 4 ) ) ;
                        dR2.setJulio( ( meses[ 6 ] == null ) ? cero : meses[ 6 ].setScale( 4 ) ) ;
                        dR2.setAgosto( ( meses[ 7 ] == null ) ? cero : meses[ 7 ].setScale( 4 ) ) ;
                        dR2.setSeptiembre( ( meses[ 8 ] == null ) ? cero : meses[ 8 ].setScale( 4 ) ) ;
                        dR2.setOctubre( ( meses[ 9 ] == null ) ? cero : meses[ 9 ].setScale( 4 ) ) ;
                        dR2.setNoviembre( ( meses[ 10 ] == null ) ? cero : meses[ 10 ].setScale( 4 ) ) ;
                        dR2.setDicienmre( ( meses[ 11 ] == null ) ? cero : meses[ 11 ].setScale( 4 ) ) ;
                        dR2.setTotal( qs[ 4 ].setScale( 4 ) ) ;
                        
                        res.add( dR2 ) ;
                        esta = true ;
                    }
                    
                    if( !esta ){
                        
                        // SI NO LO ENCUENTRA, LO AREGA
                        BigDecimal[ ] meses = porMes( l.getIni( ) , l.getFin( ) , l.getTotal( ) , f.getAnio( ) ) ;
                        BigDecimal[ ] qs = sumaQ( meses ) ;
                        
                        dR2.setPais( l.getPais( ) ) ;
                        dR2.setCuenta( l.getCuenta( ) ) ;
                        dR2.setTipoCuenta( l.getTipoCuenta( ) ) ;
                        dR2.setEnero( ( meses[ 0 ] == null ) ? cero : meses[ 0 ].setScale( 4 ) ) ;
                        dR2.setFebrero( ( meses[ 1 ] == null ) ? cero : meses[ 1 ].setScale( 4 ) ) ;
                        dR2.setMarzo( ( meses[ 2 ] == null ) ? cero : meses[ 2 ].setScale( 4 ) ) ;
                        dR2.setAbril( ( meses[ 3 ] == null ) ? cero : meses[ 3 ].setScale( 4 ) ) ;
                        dR2.setMayo( ( meses[ 4 ] == null ) ? cero : meses[ 4 ].setScale( 4 ) ) ;
                        dR2.setJunio( ( meses[ 5 ] == null ) ? cero : meses[ 5 ].setScale( 4 ) ) ;
                        dR2.setJulio( ( meses[ 6 ] == null ) ? cero : meses[ 6 ].setScale( 4 ) ) ;
                        dR2.setAgosto( ( meses[ 7 ] == null ) ? cero : meses[ 7 ].setScale( 4 ) ) ;
                        dR2.setSeptiembre( ( meses[ 8 ] == null ) ? cero : meses[ 8 ].setScale( 4 ) ) ;
                        dR2.setOctubre( ( meses[ 9 ] == null ) ? cero : meses[ 9 ].setScale( 4 ) ) ;
                        dR2.setNoviembre( ( meses[ 10 ] == null ) ? cero : meses[ 10 ].setScale( 4 ) ) ;
                        dR2.setDicienmre( ( meses[ 11 ] == null ) ? cero : meses[ 11 ].setScale( 4 ) ) ;
                        dR2.setTotal( qs[ 4 ].setScale( 4 ) ) ;
                            
                        res.add( dR2 ) ;
                            
                    }
                    
                }// FIN barre lista que mando el query
                
            }catch( Exception e ){
                e.printStackTrace( ) ;
            }
                
            }
        
        return res;
    }
    
   private static BigDecimal[ ] porMes( Timestamp ini , Timestamp fin, BigDecimal total , int anio ){
       
       BigDecimal[ ] meses = new BigDecimal[ 12 ] ;
       BigDecimal tMes = new BigDecimal( 0 ) , 
               bigDDuracion = new BigDecimal( 0 ) ;
       
       String fi = ini.toString( ) ,
               ff = fin.toString( ) ,
               mi = fi.substring(5, 7) ,
               mf = ff.substring(5, 7) , 
               anioIni = fi.substring(0, 4) ,
               anioFin = ff.substring(0, 4) ;
       
       int mIni = Integer.parseInt( mi ) ,
               mFin = Integer.parseInt( mf ) ,
               duracion = 0 ,
               yearIni = Integer.parseInt( anioIni ) ,
               yearFin = Integer.parseInt( anioFin ) ;
       
       if( mFin < mIni ){
           
           duracion = mIni - 12 ;
           duracion += mFin ;
           duracion += 1 ;
           
       }else
           if( mFin > mIni ){
               
               duracion = mFin - mIni ;
               duracion += 1 ;
           }else
               if( mFin == mIni ){
                   
                   duracion = 1 ;
                   
               }
       
       bigDDuracion = new BigDecimal( duracion ) ;
       
       tMes = total.divide( bigDDuracion ) ;
       
       if( mFin < mIni ){
           
           if( anio == yearIni ){
               
               for( int x = mIni ; x < 13 ; x++ ){
               
               meses[ x - 1 ] = tMes ;
               
           }
               
       }else if( anio == yearFin ){
           
           for( int x = 1 ; x <= mFin ; x++ ){
               
               meses[ x - 1 ] = tMes ;
               
           }
           
       }           
           
       }else
           if( mFin > mIni ){
               
               for( int x = mIni ; x <= mFin ; x++ ){
               
                    meses[ x - 1 ] = tMes ;

                }
               
           }else
               if( mFin == mIni ){
                   
                   meses[ mIni ] = tMes ;
                   
               }
       
       
       return meses ;
        
   }
   
   public static BigDecimal[ ] sumaQ( BigDecimal[ ] meses ){
       
       BigDecimal[ ] qs = new BigDecimal[ 5 ] ;
       
       BigDecimal q1 = new BigDecimal( 0 ) ,
               q2 = new BigDecimal( 0 ) ,
               q3 = new BigDecimal( 0 ) ,
               q4 = new BigDecimal( 0 ) ,
               total = new BigDecimal( 0 ) ,
               cero = new BigDecimal( 0 ) ;
       try{
           
           q1 = q1.add( ( meses[ 0 ] == null ) ? cero : meses[ 0 ] ) ;
            q1 = q1.add( ( meses[ 1 ] == null ) ? cero : meses[ 1 ] ) ;
            q1 = q1.add( ( meses[ 2 ] == null ) ? cero : meses[ 2 ] ) ;
            q2 = q2.add( ( meses[ 3 ] == null ) ? cero : meses[ 3 ] ) ;
            q2 = q2.add( ( meses[ 4 ] == null ) ? cero : meses[ 4 ] ) ;
            q2 = q2.add( ( meses[ 5 ] == null ) ? cero : meses[ 5 ] ) ;
            q3 = q3.add( ( meses[ 6 ] == null ) ? cero : meses[ 6 ] ) ;
            q3 = q3.add( ( meses[ 7 ] == null ) ? cero : meses[ 7 ] ) ;
            q3 = q3.add( ( meses[ 8 ] == null ) ? cero : meses[ 8 ] ) ;
            q4 = q4.add( ( meses[ 9 ] == null ) ? cero : meses[ 9 ] ) ;
            q4 = q4.add( ( meses[ 10 ] == null ) ? cero : meses[ 10 ] ) ;
            q4 = q4.add( ( meses[ 11 ] == null ) ? cero : meses[ 11 ] ) ;
            total = total.add( ( q1 == null ) ? cero : q1 ) ;
            total = total.add( ( q2 == null ) ? cero : q2 ) ;
            total = total.add( ( q3 == null ) ? cero : q3 ) ;
            total = total.add( ( q4 == null ) ? cero : q4 ) ;

            qs[ 0 ] = q1.setScale( 4 ) ;
            qs[ 1 ] = q2.setScale( 4 ) ;
            qs[ 2 ] = q3.setScale( 4 ) ;
            qs[ 3 ] = q4.setScale( 4 ) ;
            qs[ 4 ] = total.setScale( 4 ) ;
           
       }catch( Exception e ){
           e.printStackTrace( ) ;
       }
       
       
       return qs ;
       
   }
    
}// FIN DE LA CLASE 
